import { defineStore } from 'pinia';
import { getFileType, getFileLibrary } from '../utils/dataService';
import cosFileService from '../services/CosFileService';

/**
 * 文件预览状态管理
 * 用于管理文件预览相关的状态和操作
 */
export const useFilePreviewStore = defineStore('filePreview', {
  state: () => ({
    // 当前预览的文件
    file: null,
    
    // 预览组件类型，可选值：'FilePreview', 'DocumentViewer'
    preferredViewer: 'FilePreview',
    
    // 预览历史记录
    fileHistory: [],
    
    // 最大历史记录数量
    maxHistoryItems: 10,
    
    currentPath: '',
    files: [],
    loading: false,
    breadcrumbParts: [],
    
    // 分享模态框状态
    shareDialogVisible: false,
    shareLink: ''
  }),
  
  getters: {
    // 是否有文件正在预览
    hasFile: (state) => !!state.file,
    
    // 获取当前预览的文件
    getCurrentFile: (state) => state.file,
    
    // 获取首选预览组件
    viewerType: (state) => state.preferredViewer,
    
    // 获取历史记录
    getFileHistory: (state) => state.fileHistory,
    
    // 计算面包屑导航
    getBreadcrumbParts: (state) => {
      if (!state.currentPath) return [];
      
      // 分割路径并过滤空字符串
      const parts = state.currentPath.split('/').filter(Boolean);
      
      // 构建面包屑导航项
      return parts.map((part, index) => {
        // 构建到当前部分的路径
        const path = parts.slice(0, index + 1).join('/');
        return { name: part, path };
      });
    },
    
    // 获取文件列表
    getFiles: (state) => state.files,
    
    // 获取当前路径
    getCurrentPath: (state) => state.currentPath,
    
    // 获取分享对话框状态
    getShareDialogVisible: (state) => state.shareDialogVisible,
    
    // 获取分享链接
    getShareLink: (state) => state.shareLink
  },
  
  actions: {
    /**
     * 设置预览文件
     * @param {Object} file 文件对象
     */
    setFile(file) {
      console.log('设置当前文件:', file);
      
      // 确保文件有类型
      if (file && !file.type) {
        file.type = getFileType(file.name);
        console.log('推断文件类型:', file.type);
      }
      
      this.file = file;
      
      // 添加到历史记录
      if (file) {
        this.addToHistory(file);
      }
    },
    
    /**
     * 清除当前预览文件
     */
    clearFile() {
      this.file = null;
    },
    
    /**
     * 切换预览组件类型
     */
    toggleViewer() {
      this.preferredViewer = this.preferredViewer === 'FilePreview' ? 'DocumentViewer' : 'FilePreview';
    },
    
    /**
     * 设置首选预览组件
     * @param {String} viewerType 预览组件类型
     */
    setPreferredViewer(viewerType) {
      if (['FilePreview', 'DocumentViewer'].includes(viewerType)) {
        this.preferredViewer = viewerType;
      }
    },
    
    /**
     * 添加文件到历史记录
     * @param {Object} file 文件对象
     */
    addToHistory(file) {
      // 创建历史记录项
      const historyItem = {
        ...file,
        timestamp: new Date().getTime()
      };
      
      // 检查是否已存在
      const existingIndex = this.fileHistory.findIndex(item => 
        item.name === file.name && item.url === file.url
      );
      
      // 如果已存在，更新时间戳并移到最前
      if (existingIndex !== -1) {
        this.fileHistory.splice(existingIndex, 1);
      }
      
      // 添加到历史记录开头
      this.fileHistory.unshift(historyItem);
      
      // 限制历史记录数量
      if (this.fileHistory.length > this.maxHistoryItems) {
        this.fileHistory.pop();
      }
      
      console.log('更新后的历史记录:', this.fileHistory);
    },
    
    /**
     * 清空历史记录
     */
    clearHistory() {
      this.fileHistory = [];
    },
    
    // 从历史记录中移除文件
    removeFromHistory(index) {
      if (index >= 0 && index < this.fileHistory.length) {
        this.fileHistory.splice(index, 1);
      }
    },
    
    // 设置当前路径并加载文件
    async setPath(path, useCosService = true) {
      console.log('设置路径:', path);
      this.currentPath = path || '';
      this.breadcrumbParts = this.getBreadcrumbParts;
      
      if (useCosService) {
        await this.loadFiles(useCosService);
      }
    },
    
    // 加载文件列表
    async loadFiles(useCosService = true) {
      // 如果已经在加载中，不要重复加载
      if (this.loading) return;
      
      this.loading = true;
      console.log('开始加载文件列表, 路径:', this.currentPath, '使用COS:', useCosService);
      
      try {
        // 先清空文件列表，避免显示旧数据
        this.files = [];
        
        if (useCosService && cosFileService.isInitialized) {
          const result = await cosFileService.listFiles(this.currentPath);
          console.log('COS返回文件列表:', result);
          this.files = [...result.directories, ...result.files];
        } else {
          this.files = await getFileLibrary(useCosService, this.currentPath);
        }
        console.log('文件加载完成, 数量:', this.files.length);
      } catch (error) {
        console.error('加载文件失败:', error);
        this.files = [];
      } finally {
        // 直接关闭loading状态
        this.loading = false;
      }
    },
    
    // 导航到指定路径
    async navigateTo(path) {
      console.log('Store导航到路径:', path);
      await this.setPath(path);
    },
    
    // 清空文件列表
    clearFiles() {
      console.log('清空文件列表');
      this.files = [];
    },
    
    // 打开分享对话框
    openShareDialog(link = '') {
      this.shareDialogVisible = true;
      if (link) {
        this.shareLink = link;
      }
    },
    
    // 关闭分享对话框
    closeShareDialog() {
      this.shareDialogVisible = false;
    },
    
    // 设置分享链接
    setShareLink(link) {
      this.shareLink = link;
    }
  },
  
  persist: {
    storage: localStorage,
    paths: ['preferredViewer', 'fileHistory']
  }
}); 